用到的地方
1.每秒更新時間
2.每15分提醒眼睛需要休息
3.提醒:下班時間到了
4.更新UI上的時鐘
同一執行緒 VS.不同執行緒
System.Windows.Forms.Timer 存取UI元件 (同一執行緒)
System.Timers.Timer
-存取UI元件 用SynchronizingObject屬性 (設為同一執行緒)
-存取UI元件 訪問 (不同執行緒)
System.Threading.Timer(透由委派來存取UI元件)
時間單位為毫秒(ms) 1000是一秒
只要把工具箱中的Timer控制項拖到表單上,然後設置事件和間隔時間等屬性就可以了
Start 方法啟用定時器,開始觸發 Elapsed
Stop 方法停止定時器,停止觸發 Elapsed
拉timer
在load時啟動timer
private void Timer1_Load(object sender, EventArgs e)
{
timer2.Start();
}
撰寫tick 事件
private void timer2_Tick(object sender, EventArgs e)
{
//在這裡做想做的事 label1.Text = (int.Parse(label1.Text) + 1).ToString();
}
Start 方法啟用定時器,開始觸發 Elapsed
Stop 方法停止定時器,停止觸發 Elapsed
private System.Timers.Timer _TimersTimer;
private void Timer2_Load(object sender, EventArgs e)
{
this._TimersTimer = new System.Timers.Timer();
this._TimersTimer.Interval = 100;
this._TimersTimer.Elapsed += new System.Timers.ElapsedEventHandler(_TimersTimer_Elapsed);
this._TimersTimer.Start();
}
void _TimersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//在這裡做想做的事
}
存取UI
出現錯誤訊息 : 跨執行緒作業無效: 存取控制項 'label1' 時所使用的執行緒與建立控制項的執行緒不同。
解決方法
拉一個label做顯示
private System.Timers.Timer _TimersTimer;
private void Timer2_Load(object sender, EventArgs e)
{
this._TimersTimer = new System.Timers.Timer();
this._TimersTimer.Interval = 100;
this._TimersTimer.Elapsed += new System.Timers.ElapsedEventHandler(_TimersTimer_Elapsed);
this._TimersTimer.SynchronizingObject = this;
this._TimersTimer.Start();
}
void _TimersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//在這裡做想做的事 label1.Text = (int.Parse(label1.Text) + 1).ToString();
}
private System.Timers.Timer _TimersTimer;
private void Timer22_f_Load(object sender, EventArgs e)
{
this._TimersTimer = new System.Timers.Timer();
this._TimersTimer.Interval = 100;
this._TimersTimer.Elapsed += new System.Timers.ElapsedEventHandler(_TimersTimer_Elapsed);
this._TimersTimer.Start();
}
private void Timer22_f_FormClosed(object sender, FormClosedEventArgs e)
{
_TimersTimer.Stop();//如果不停的話,timer會繼續跑而且找不到label就會出錯
}
delegate void UpdateControl1( string Msg);
private object _objLock1 = new object();
void _mUpdateControl( string Msg)
{
lock (this._objLock1)
{
label1.Text = Msg;
}
}
void _TimersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
int iVal = (int.Parse(label1.Text) + 1);
this.BeginInvoke(
new UpdateControl1(_mUpdateControl)//fuction
, new object[] { iVal }//param
);
}
不斷更新時間
不斷更新時間的同時,也能在textbox輸入
using System.Threading;
private void button9_Click(object sender, EventArgs e)
{
//宣告timer要做什麼事.要做什麼事呢?要做_do的事
TimerCallback callback = new TimerCallback(_do);
//1.function 2.開關 3.等多久再開始 4.隔多久反覆執行
System.Threading.Timer timer = new System.Threading.Timer(callback,null,0,1000);
}
private void _do(object state)
{
int count=0;
while(count<100)
{
Console.WriteLine(count);
}
}
存取UI
private void button9_Click(object sender, EventArgs e)
{
//宣告timer要做什麼事.要做什麼事呢?要做_do的事
TimerCallback callback = new TimerCallback(_do);
//1.function 2.開關 3.等多久再開始 4.隔多久反覆執行
System.Threading.Timer timer = new System.Threading.Timer(callback,null,0,1000);
}
private void _do(object state)
{
this.BeginInvoke(new setLable2(setLabel2));
//label2.Text = DateTime.Now.ToString();
//Console.WriteLine(DateTime.Now.ToString());
}
delegate void setLable2();
private void setLabel2()
{
label2.Text = DateTime.Now.ToString();
}
Q
它有點像接力賽,跑一跑,交棒換別人,然後再等著棒子回來再繼續做.
AutoResetEvent AutoResetEvent = new AutoResetEvent(false);//它是開關,開始/停(換人)/結束
?autoEvent.Set();//交棒出去//?沒有交棒出去,UI上也能輸入.所以交棒的用意在哪裡呢?
AutoResetEvent.WaitOne();